import { dictDataAll } from '@/api/setting/dict'
import { reactive, toRaw } from 'vue'

interface Options {
    [propName: string]: {
        api: PromiseFun
        params?: Record<string, any>
        transformData?(data: any): any
    }
}

// {
//     dict: {
//         api: dictData,
//         params: { name: 'user' },
//         transformData(data: any) {
//             return data.list
//         }
//     }
// }

/**
 * 自定义hook，用于获取字典选项数据
 * @param options 配置对象，包含各个字段的api配置信息
 * @returns 返回包含选项数据和刷新方法的对象
 */
export function useDictOptions<T = any>(options: Options) {
    const optionsData: any = reactive({})
    const optionsKey = Object.keys(options)

    // 构建api调用列表
    const apiLists = optionsKey.map((key) => {
        const value = options[key]
        optionsData[key] = []
        return () => value.api(toRaw(value.params) || {})
    })

    /**
     * 刷新所有选项数据
     * 调用所有配置的api并更新对应的数据
     */
    const refresh = async () => {
        const res = await Promise.allSettled<Promise<any>>(apiLists.map((api) => api()))
        res.forEach((item, index) => {
            const key = optionsKey[index]
            if (item.status == 'fulfilled') {
                const { transformData } = options[key]
                const data = transformData ? transformData(item.value) : item.value
                optionsData[key] = data
            }
        })
    }

    // 初始化时调用一次刷新
    refresh()

    return {
        optionsData: optionsData as T,
        refresh
    }
}


// useDictOptions<{
//     dict: any[]
// }>({
//     dict: dictData
// })

/**
 * 根据字典类型数组获取字典数据
 * @param dict 字典类型数组，每个元素代表一种字典类型
 * @returns 包含字典数据的对象，通过dictData属性访问
 */
export function useDictData<T = any>(dict: string[]) {
    // 构建字典配置选项
    const options: Options = {}
    for (const type of dict) {
        options[type] = {
            api: dictDataAll,
            params: {
                dictType: type
            }
        }
    }
    // 获取字典选项数据
    const { optionsData } = useDictOptions<T>(options)
    return {
        dictData: optionsData
    }
}
